// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
// import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../MySqlObjectImpl.h"
#include "MySqlExprImpl.h"

class MySqlJSONTableExpr_Column : virtual public MySqlObjectImpl
{
  MySqlJSONTableExpr_Column_list_ptr nestedColumns;
  SQLName_ptr name;
  SQLDataType_ptr dataType;
  SQLExpr_ptr path;
  BOOL_ptr ordinality;
  BOOL_ptr exists;
  SQLExpr_ptr onError;
  SQLExpr_ptr onEmpty;

  MySqlJSONTableExpr_Column();
  SHAREDOBJECT(MySqlJSONTableExpr_Column);

  // @Override
  void accept0(MySqlASTVisitor_ptr v);

  SQLName_ptr getName();
  void setName(SQLName_ptr x);

  SQLDataType_ptr getDataType();

  void setDataType(SQLDataType_ptr x);

  SQLExpr_ptr getPath();

  void setPath(SQLExpr_ptr x);

  BOOL_ptr isOrdinality();

  void setOrdinality(BOOL_ptr ordinality);

  BOOL_ptr isExists();

  void setExists(BOOL_ptr exists);

  SQLExpr_ptr getOnError();

  void setOnError(SQLExpr_ptr x);

  SQLExpr_ptr getOnEmpty();

  void setOnEmpty(SQLExpr_ptr x);

  MySqlJSONTableExpr_Column_list_ptr getNestedColumns();

  void addNestedColumn(MySqlJSONTableExpr_Column_ptr column);
};

class MySqlJSONTableExpr : virtual public MySqlExprImpl
{
  MySqlJSONTableExpr_Column_list_ptr columns;
  SQLExpr_ptr expr;
  SQLExpr_ptr path;

  MySqlJSONTableExpr();
  SHAREDOBJECT(MySqlJSONTableExpr);
  
  // @Override
  void accept0(MySqlASTVisitor_ptr v);

  // @Override
  SQLObject_list_ptr getChildren();

  SQLExpr_ptr getExpr();

  void setExpr(SQLExpr_ptr x);

  SQLExpr_ptr getPath();

  void setPath(SQLExpr_ptr x);

  MySqlJSONTableExpr_Column_list_ptr getColumns();

  void addColumn(MySqlJSONTableExpr_Column_ptr column);
};
